home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 1997 #3
/
Amiga Plus CD - 1997 - No. 03.iso
/
pd
/
programmierung
/
alienbreed3d2_src
/
cheesesauce
/
hireswall.s
< prev
next >
Wrap
Text File
|
1997-01-31
|
37KB
|
2,622 lines
leftclip: dc.w 0
rightclip: dc.w 0
deftopclip: dc.w 0
defbotclip: dc.w 0
leftclipandlast: dc.w 0
SCALE MACRO
dc.w 64*0
dc.w 64*1
dc.w 64*1
dc.w 64*2
dc.w 64*2
dc.w 64*3
dc.w 64*3
dc.w 64*4
dc.w 64*4
dc.w 64*5
dc.w 64*5
dc.w 64*6
dc.w 64*6
dc.w 64*7
dc.w 64*7
dc.w 64*8
dc.w 64*8
dc.w 64*9
dc.w 64*9
dc.w 64*10
dc.w 64*10
dc.w 64*11
dc.w 64*11
dc.w 64*12
dc.w 64*12
dc.w 64*13
dc.w 64*13
dc.w 64*14
dc.w 64*14
dc.w 64*15
dc.w 64*15
dc.w 64*16
dc.w 64*16
dc.w 64*17
dc.w 64*17
dc.w 64*18
dc.w 64*18
dc.w 64*19
dc.w 64*19
dc.w 64*20
dc.w 64*20
dc.w 64*21
dc.w 64*21
dc.w 64*22
dc.w 64*22
dc.w 64*23
dc.w 64*23
dc.w 64*24
dc.w 64*24
dc.w 64*25
dc.w 64*25
dc.w 64*26
dc.w 64*26
dc.w 64*27
dc.w 64*27
dc.w 64*28
dc.w 64*28
dc.w 64*29
dc.w 64*29
dc.w 64*30
dc.w 64*30
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
ENDM
***********************************
* The screendivide routine is simpler
* using a0=left pixel
* a2= right pixel
* d0= left dist
* d2= right dist
* d4 = left strip
* d5 = right strip
* (a0)=leftx
* 2(a0)=rightx
* 4(a0)=leftbm
* 6(a0)=rightbm
* 8(a0)=leftdist
* 10(a0)=rightdist
* 12(a0)=lefttop
* 14(a0)=righttop
* 16(a0)=leftbot
* 18(a0)=rightbot
Doleftend:
move.w leftclip,d0
sub.w #1,d0
move.w d0,leftclipandlast
move.w (a0),d0
move.w 2(a0),d1
sub.w d0,d1
bge.s sometodraw
rts
sometodraw:
move.w itertab(pc,d1.w*4),d7
swap d0
move.w itertab+2(pc,d1.w*4),d6
clr.w d0
swap d1
clr.w d1
asr.l d6,d1
move.l d1,(a0)
bra pstit
itertab:
incbin "ab3:includes/iterfile"
pstit:
moveq #0,d1
move.w 4(a0),d1
moveq #0,d2
move.w 6(a0),d2
sub.w d1,d2
swap d1
swap d2
asr.l d6,d2
move.l d2,4(a0)
moveq #0,d2
move.w 8(a0),d2
moveq #0,d3
move.w 10(a0),d3
sub.w d2,d3
swap d2
swap d3
asr.l d6,d3
move.l d3,8(a0)
moveq #0,d3
move.w 12(a0),d3
moveq #0,d4
move.w 14(a0),d4
sub.w d3,d4
swap d3
swap d4
asr.l d6,d4
move.l d4,12(a0)
moveq #0,d4
move.w 16(a0),d4
moveq #0,d5
move.w 18(a0),d5
sub.w d4,d5
swap d4
swap d5
asr.l d6,d5
move.l d5,16(a0)
*** Gouraud shading ***
moveq #0,d5
move.w 26(a0),d5
sub.w 24(a0),d5
add.w d5,d5
swap d5
asr.l d6,d5
move.l d5,28(a0)
moveq #0,d5
move.w 24(a0),d5
add.w d5,d5
swap d5
bra screendivide
itercount: dc.w 0
screendividethru:
.scrdrawlop:
move.w (a0)+,d0
; move.l FASTBUFFER,a3
move.l frompt,a3
adda.w .scrintocop(pc,d0.w*2),a3
move.l (a0)+,d1
bra .pastscrinto
.scrintocop:
incbin "ab3:includes/XTOCOPX"
.pastscrinto:
swap d1
move.w d1,d6
and.w HORAND,d6
move.l (a0)+,d2
swap d2
add.w fromtile(pc),d6
add.w d6,d6
move.w d6,a5
move.l (a0)+,d3
swap d3
add.l #divthreetab,a5
move.w (a5),StripData
move.l ChunkAddr,a5
moveq #0,d6
move.b StripData,d6
add.w d6,d6
move.w VALSHIFT,d4
asl.l d4,d6
add.l d6,a5
move.l (a0)+,d4
swap d4
move.w d2,d6
***************************
* old version
asr.w #7,d6
***************************
; asr.w #3,d6
; sub.w #4,d6
; cmp.w #6,d6
; blt.s tstbrbr
; move.w #6,d6
;tstbrbr:
***************************
add.w angbright(pc),d6
bge.s .brnotneg
moveq #0,d6
.brnotneg
cmp.w #32,d6
blt.s .brnotpos
move.w #32,d6
.brnotpos
move.l PaletteAddr,a2
move.l a2,a4
add.w .ffscrpickhowbright(pc,d6*2),a2
; and.b #$fe,d6
; add.w .ffscrpickhowbright(pc,d6*2),a4
; btst #0,d0
; beq .nobrightswap
; exg a2,a4
;.nobrightswap:
move.w d7,-(a7)
bsr ScreenWallstripdrawthru
move.w (a7)+,d7
dbra d7,.scrdrawlop
rts
.ffscrpickhowbright:
SCALE
***************************
screendivide:
or.l #$ffff0000,d7
move.w leftclipandlast(pc),d6
move.l #WorkSpace,a2
move.l (a0),a3
move.l 4(a0),a4
move.l 8(a0),a5
move.l 12(a0),a6
move.l 16(a0),a1
move.l 28(a0),a0
scrdivlop:
swap d0
cmp.w d6,d0
bgt scrnotoffleft
swap d0
add.l a4,d1
add.l a5,d2
add.l a6,d3
add.l a1,d4
add.l a3,d0
add.l a0,d5
dbra d7,scrdivlop
rts
scrnotoffleft:
move.w d0,d6
cmp.w rightclip(pc),d0
bge.s outofcalc
scrnotoffright:
move.w d0,(a2)+
move.l d1,(a2)+
move.l d2,(a2)+
move.l d3,(a2)+
move.l d4,(a2)+
move.l d5,(a2)+
swap d0
add.l a3,d0
add.l a4,d1
add.l a5,d2
add.l a6,d3
add.l a1,d4
add.l a0,d5
add.l #$10000,d7
dbra d7,scrdivlop
outofcalc:
swap d7
tst.w d7
bge.s .somethingtodraw
rts
.somethingtodraw:
move.l #consttab,a1
move.l #WorkSpace,a0
tst.b FULLSCR
bne screendivideFULL
; tst.b seethru
; bne screendividethru
tst.b DOUBLEWIDTH
bne scrdrawlopDOUB
scrdrawlop:
move.w (a0)+,d0
; move.l FASTBUFFER,a3
move.l frompt,a3
adda.w .scrintocop(pc,d0.w*2),a3
; lea (a3,d0.w),a3
move.l (a0)+,d1
bra .pastscrinto
.scrintocop:
incbin "XTOCOPX"
.pastscrinto
swap d1
move.w d1,d6
and.w HORAND,d6
move.l (a0)+,d2
swap d2
add.w fromtile(pc),d6
add.w d6,d6
move.w d6,a5
move.l (a0)+,d3
swap d3
add.l #divthreetab,a5
move.w (a5),StripData
move.l ChunkAddr,a5
moveq #0,d6
move.b StripData,d6
add.w d6,d6
move.w VALSHIFT,d4
asl.l d4,d6
add.l d6,a5
move.l (a0)+,d4
swap d4
addq #1,d4
move.w d2,d6
***************************
* old version
asr.w #7,d6
***************************
; asr.w #3,d6
; sub.w #4,d6
; cmp.w #6,d6
; blt.s tstbrbr
; move.w #6,d6
;tstbrbr:
***************************
move.l (a0)+,d5
swap d5
ext.w d5
add.w d5,d6
bge.s .brnotneg
moveq #0,d6
.brnotneg
cmp.w #64,d6
blt.s .brnotpos
move.w #64,d6
.brnotpos
move.l PaletteAddr,a2
move.l a2,a4
add.w ffscrpickhowbright(pc,d6*2),a2
and.b #$fe,d6
add.w ffscrpickhowbright(pc,d6*2),a4
btst #0,d0
beq .nobrightswap
exg a2,a4
.nobrightswap:
move.w d7,-(a7)
bsr ScreenWallstripdraw
move.w (a7)+,d7
toosmall:
dbra d7,scrdrawlop
rts
ffscrpickhowbright:
SCALE
thislineodd:
add.w #4+4+4+4+4,a0
dbra d7,scrdrawlopDOUB
rts
scrdrawlopDOUB:
move.w (a0)+,d0
btst #0,d0
bne.s thislineodd
; move.l FASTBUFFER,a3
; lea (a3,d0.w),a3
move.l frompt,a3
adda.w .scrintocop(pc,d0.w),a3
move.l (a0)+,d1
bra .pastscrinto
.scrintocop:
incbin "XTOCOPX"
.pastscrinto
swap d1
move.w d1,d6
and.w HORAND,d6
move.l (a0)+,d2
swap d2
add.w fromtile(pc),d6
add.w d6,d6
move.w d6,a5
move.l (a0)+,d3
swap d3
add.l #divthreetab,a5
move.w (a5),StripData
move.l ChunkAddr,a5
moveq #0,d6
move.b StripData,d6
add.w d6,d6
move.w VALSHIFT,d4
asl.l d4,d6
add.l d6,a5
move.l (a0)+,d4
swap d4
addq #1,d4
move.w d2,d6
***************************
* old version
asr.w #7,d6
***************************
; asr.w #3,d6
; sub.w #4,d6
; cmp.w #6,d6
; blt.s tstbrbr
; move.w #6,d6
;tstbrbr:
***************************
move.l (a0)+,d5
swap d5
ext.w d5
add.w d5,d6
bge.s .brnotneg
moveq #0,d6
.brnotneg
cmp.w #64,d6
blt.s .brnotpos
move.w #64,d6
.brnotpos
move.l PaletteAddr,a2
move.l a2,a4
add.w ffscrpickhowbrightD(pc,d6*2),a2
and.b #$fe,d6
add.w ffscrpickhowbrightD(pc,d6*2),a4
btst #0,d0
beq .nobrightswap
exg a2,a4
.nobrightswap:
move.w d7,-(a7)
bsr ScreenWallstripdraw
move.w (a7)+,d7
dbra d7,scrdrawlopDOUB
rts
middleline:
dc.w 0
;scrintocop:
; incbin "XTOCOPX"
prot4: dc.w 0
fromtile: dc.l 0
fromquartertile: dc.l 0
swapbrights: dc.w 0
angbright: dc.w 0
leftside: dc.b 0
rightside: dc.b 0
firstleft: dc.w 0
ffscrpickhowbrightD:
SCALE
screendivideFULL:
tst.b DOUBLEWIDTH
bne scrdrawlopFULLDOUB
scrdrawlopFULL:
move.w (a0)+,d0
move.l FASTBUFFER,a3
lea (a3,d0.w),a3
move.l (a0)+,d1
; bra pastscrinto
;
;
;pastscrinto
swap d1
move.w d1,d6
and.w HORAND,d6
move.l (a0)+,d2
swap d2
add.w fromtile(pc),d6
add.w d6,d6
move.w d6,a5
move.l (a0)+,d3
swap d3
add.l #divthreetab,a5
move.w (a5),StripData
move.l ChunkAddr,a5
moveq #0,d6
move.b StripData,d6
add.w d6,d6
move.w VALSHIFT,d4
asl.l d4,d6
add.l d6,a5
move.l (a0)+,d4
swap d4
addq #1,d4
move.w d2,d6
***************************
* old version
asr.w #7,d6
***************************
; asr.w #3,d6
; sub.w #4,d6
; cmp.w #6,d6
; blt.s tstbrbr
; move.w #6,d6
;tstbrbr:
***************************
move.l (a0)+,d5
swap d5
ext.w d5
add.w d5,d6
bge.s .brnotneg
moveq #0,d6
.brnotneg
cmp.w #64,d6
blt.s .brnotpos
move.w #64,d6
.brnotpos
move.l PaletteAddr,a2
move.l a2,a4
add.w ffscrpickhowbrightFULL(pc,d6*2),a2
and.b #$fe,d6
add.w ffscrpickhowbrightFULL(pc,d6*2),a4
btst #0,d0
beq .nobrightswap
exg a2,a4
.nobrightswap:
move.w d7,-(a7)
bsr ScreenWallstripdrawBIG
move.w (a7)+,d7
dbra d7,scrdrawlopFULL
rts
ffscrpickhowbrightFULL:
SCALE
itsanoddone:
add.w #4+4+4+4+4,a0
dbra d7,scrdrawlopFULLDOUB
rts
scrdrawlopFULLDOUB:
move.w (a0)+,d0
btst #0,d0
bne.s itsanoddone
move.l FASTBUFFER,a3
lea (a3,d0.w),a3
move.l (a0)+,d1
; bra pastscrinto
;
;
;pastscrinto
swap d1
move.w d1,d6
and.w HORAND,d6
move.l (a0)+,d2
swap d2
add.w fromtile(pc),d6
add.w d6,d6
move.w d6,a5
move.l (a0)+,d3
swap d3
add.l #divthreetab,a5
move.w (a5),StripData
move.l ChunkAddr,a5
moveq #0,d6
move.b StripData,d6
add.w d6,d6
move.w VALSHIFT,d4
asl.l d4,d6
add.l d6,a5
move.l (a0)+,d4
swap d4
addq #1,d4
move.w d2,d6
***************************
* old version
asr.w #7,d6
***************************
; asr.w #3,d6
; sub.w #4,d6
; cmp.w #6,d6
; blt.s tstbrbr
; move.w #6,d6
;tstbrbr:
***************************
move.l (a0)+,d5
swap d5
ext.w d5
add.w d5,d6
bge.s .brnotneg
moveq #0,d6
.brnotneg
cmp.w #64,d6
blt.s .brnotpos
move.w #64,d6
.brnotpos
move.l PaletteAddr,a2
move.l a2,a4
add.w ffscrpickhowbrightFULLDOUB(pc,d6*2),a2
and.b #$fe,d6
add.w ffscrpickhowbrightFULLDOUB(pc,d6*2),a4
btst #0,d0
beq .nobrightswap
exg a2,a4
.nobrightswap:
move.w d7,-(a7)
bsr ScreenWallstripdrawBIG
move.w (a7)+,d7
dbra d7,scrdrawlopFULLDOUB
rts
ffscrpickhowbrightFULLDOUB:
SCALE
divthreetab:
val SET 0
REPT 220
dc.b val,0
dc.b val,1
dc.b val,2
val SET val+1
ENDR
StripData: dc.w 0
* using a0=left pixel
* a2= right pixel
* d0= left height
* d2= right height
* d4 = left strip
* d5 = right strip
* Routine to draw a wall;
* pass it X and Z coords of the endpoints
* and the start and end length, and a number
* representing the number of the wall.
* a0=x1 d1=z1 a2=x2 d3=z2
* d4=sl d5=el
* a1 = strip buffer
store: ds.l 500
******************************************************************
* Curve drawing routine. We have to know:
* The top and bottom of the wall
* The point defining the centre of the arc
* the point defining the starting point of the arc
* the start and end angles of the arc
* The start and end positions along the bitmap of the arc
* Which bitmap to use for the arc
xmiddle: dc.w 0
zmiddle SET 2
dc.w 0
xradius SET 4
dc.w 0
zradius SET 6
dc.w 0
startbitmap SET 8
dc.w 0
bitmapcounter SET 10
dc.w 0
brightmult SET 12
dc.w 0
angadd SET 14
dc.l 0
xmiddlebig SET 18
dc.l 0
basebright SET 22
dc.w 0
shift SET 24
dc.w 0
count SET 26
dc.w 0
subdividevals:
dc.w 2,4
dc.w 3,8
dc.w 4,16
dc.w 5,32
dc.w 6,64
CurveDraw:
move.w (a0)+,d0 ; centre of rotation
move.w (a0)+,d1 ; point on arc
move.l #Rotated,a1
move.l #xmiddle,a2
move.l (a1,d0.w*8),d2
move.l d2,18(a2)
asr.l #7,d2
move.l (a1,d1.w*8),d4
asr.l #7,d4
sub.w d2,d4
move.w d2,(a2)
move.w d4,4(a2)
move.w 6(a1,d0.w*8),d2
move.w 6(a1,d1.w*8),d4
sub.w d2,d4
move.w d2,2(a2)
asr.w #1,d4
move.w d4,6(a2)
move.w (a0)+,d4 ; start of bitmap
move.w (a0)+,d5 ; end of bitmap
move.w d4,8(a2)
sub.w d4,d5
move.w d5,10(a2)
move.w (a0)+,d4
ext.l d4
move.l d4,14(a2)
move.w (a0)+,d4
move.l #subdividevals,a3
move.l (a3,d4.w*4),shift(a2)
move.l #walltiles,a3
add.l (a0)+,a3
adda.w wallyoff,a3
move.l a3,fromtile
move.w (a0)+,basebright(a2)
move.w (a0)+,brightmult(a2)
move.l (a0)+,topofwall
move.l (a0)+,botofwall
move.l yoff,d6
sub.l d6,topofwall
sub.l d6,botofwall
move.l #databuffer,a1
move.l #SineTable,a3
lea 2048(a3),a4
moveq #0,d0
moveq #0,d1
move.w count(a2),d7
DivideCurve
move.l d0,d2
move.w shift(a2),d4
asr.l d4,d2
move.w (a3,d2.w*2),d4
move.w d4,d5
move.w (a4,d2.w*2),d3
move.w d3,d6
muls.w 4(a2),d3
muls.w 6(a2),d4
muls.w 4(a2),d5
muls.w 6(a2),d6
sub.l d4,d3
add.l d6,d5
asl.l #2,d5
asr.l #8,d3
add.l 18(a2),d3
swap d5
move.w basebright(a2),d6
move.w brightmult(a2),d4
muls d5,d4
swap d4
add.w d4,d6
add.w 2(a2),d5
move.l d3,(a1)+
move.w d5,(a1)+
move.w d1,d2
move.w shift(a2),d4
asr.w d4,d2
add.w 8(a2),d2
move.w d2,(a1)+
move.w d6,(a1)+
add.l 14(a2),d0
add.w 10(a2),d1
dbra d7,DivideCurve
move.l a0,-(a7)
; move.w #31,d6
; move.l #0,d3
; move.l #stripbuffer,a4
;.emptylop:
; move.l d3,(a4)+
; dbra d6,.emptylop
bsr curvecalc
move.l (a7)+,a0
rts
prot3: dc.w 0
curvecalc:
move.l #databuffer,a1
move.w count(a2),d7
subq #1,d7
.findfirstinfront:
move.l (a1)+,d1
move.w (a1)+,d0
bgt.s .foundinfront
move.w (a1)+,d4
move.w (a1)+,d6
dbra d7,.findfirstinfront
; CACHE_ON d2
rts ; no two points were in front
.foundinfront:
move.w (a1)+,d4
move.w (a1)+,d6
; d1=left x, d4=left end, d0=left dist
; d6=left angbright
divs d0,d1
add.w MIDDLEX,d1
move.l topofwall(pc),d5
divs d0,d5
add.w MIDDLEY,d5
move.w d5,strtop
move.l botofwall(pc),d5
divs d0,d5
add.w MIDDLEY,d5
move.w d5,strbot
; CACHE_OFF d2
.computeloop:
move.w 4(a1),d2
bgt.s .infront
; addq #8,a1
; dbra d7,.findfirstinfront
; CACHE_ON d2
rts
.infront:
move.l #store,a0
move.l (a1),d3
move.w 6(a1),d5
add.w 8(a1),d6
asr.w #1,d6
move.w d6,angbright
divs d2,d3
add.w MIDDLEX,d3
move.w strtop(pc),12(a0)
move.w strbot(pc),16(a0)
move.l topofwall(pc),d6
divs d2,d6
add.w MIDDLEY,d6
move.w d6,strtop
move.w d6,14(a0)
move.l botofwall(pc),d6
divs d2,d6
add.w MIDDLEY,d6
move.w d6,strbot
move.w d6,18(a0)
move.w d3,2(a1)
blt.s .alloffleft
cmp.w RIGHTX,d1
bgt.s .alloffleft
cmp.w d1,d3
blt.s .alloffleft
move.w d1,(a0)
move.w d3,2(a0)
move.w d4,4(a0)
move.w d5,6(a0)
move.w d0,8(a0)
move.w d2,10(a0)
move.w d7,-(a7)
move.w #maxscrdiv,d7
bsr Doleftend
move.w (a7)+,d7
.alloffleft:
move.l (a1)+,d1
move.w (a1)+,d0
move.w (a1)+,d4
move.w (a1)+,d6
dbra d7,.computeloop
.alloffright:
; CACHE_ON d2
rts
;protcheck:
; sub.l #53624,a3
; add.l #2345215,a2
; lea passspace-$30000(pc),a1
; add.l #$30000,a1
; lea startpass(pc),a5
; move.w #endpass-startpass-1,d1
;copypass:
; move.b (a5)+,(a1)+
; dbra d1,copypass
; sub.l a5,a5
; lea passspace-$30000(pc),a1
; add.l #$30000,a1
; jsr (a1)
; lea passspace-$30000(pc),a1
; add.l #$30000,a1
; lea startpass(pc),a5
; move.w #(endpass-startpass)/2-1,d1
;erasepass:
; move.w -(a5),(a1)+
; dbra d1,erasepass
; sub.l a5,a5
; sub.l a1,a1
; eor.l #$af594c72,d0
; sub.l #123453986,a4
; move.l d0,(a4)
; add.l #123453986,a4
; move.l #0,d0
; sub.l #2345215,a2
; jsr (a2)
; sub.l a2,a2
; eor.l #$af594c72,d0
; sub.l #123453986,a4
; move.l (a4),d1
; add.l #123453986,a4
; cmp.l d1,d0
; bne.s notrightt
; add.l #53624,a3
; move.w #9,d7
;sayitsok:
; move.l (a3)+,a2
; add.l #78935450,a2
; st (a2)
; dbra d7,sayitsok
;notrightt:
; sub.l a3,a3
;nullit:
; rts
;
; incbin "ab3:includes/protroutencoded"
endprot:
******************************************************************
iters: dc.w 0
multcount: dc.w 0
walldraw:
tst.w d1
bgt.s oneinfront1
tst.w d3
bgt.s oneinfront
rts
oneinfront1
tst.w d3
ble.s oneinfront
; Bothinfront!
nop
oneinfront
move.w #128,d7
move.w #5,d6
move.w d3,d0
sub.w d1,d0
bge.s notnegzdiff
neg.w d0
notnegzdiff
; cmp.w #1024,d0
; blt.s nd01
; add.w d7,d7
; add.w #1,d6
;nd01:
cmp.w #512,d0
blt.s nd0
add.w d7,d7
add.w #1,d6
bra nha
nd0:
cmp.w #256,d0
bgt.s nh1
asr.w #1,d7
subq #1,d6
nh1:
cmp.w #128,d0
bgt.s nh2
asr.w #1,d7
subq #1,d6
nh2:
nha:
move.w d3,d0
cmp.w d1,d3
blt.s rightnearest
move.w d1,d0
rightnearest:
cmp.w #64,d0
bgt.s nd1
addq #1,d6
add.w d7,d7
nd1:
cmp.w #128,d0
blt.s nh3
asr.w #1,d7
subq #1,d6
blt.s nh3
cmp.w #256,d0
blt.s nh3
asr.w #1,d7
subq #1,d6
nh3:
move.w d6,iters
subq #1,d7
move.w d7,multcount
move.l #databuffer,a3
move.l a0,d0
move.l a2,d2
move.l d0,(a3)+
add.l d2,d0
move.w d1,(a3)+
asr.l #1,d0
move.w d4,(a3)+
move.w leftwallbright,d6
move.w d6,(a3)+
add.w d5,d4
move.l d0,(a3)+
add.w d3,d1
asr.w #1,d1
move.w d1,(a3)+
asr.w #1,d4
move.w d4,(a3)+
add.w rightwallbright,d6
asr.w #1,d6
move.w d6,(a3)+
move.l d2,(a3)+
move.w d3,(a3)+
move.w d5,(a3)+
move.w rightwallbright,(a3)+
; We now have the two endpoints and the midpoint
; so we need to perform 1 iteration of the inner
; loop, the first time.
* Decide how often to subdivide by how far away the wall is, and
* how perp. it is to the player.
move.l #databuffer,a0
move.l #databuffer2,a1
move.w iters,d6
blt noiters
move.l #1,a2
iterloop:
move.l a0,a3
move.l a1,a4
move.w a2,d7
exg a0,a1
move.l (a3)+,d0
move.w (a3)+,d1
move.l (a3)+,d2
middleloop:
move.l d0,(a4)+
move.l (a3)+,d3
add.l d3,d0
move.w d1,(a4)+
asr.l #1,d0
move.w (a3)+,d4
add.w d4,d1
move.l d2,(a4)+
asr.w #1,d1
move.l (a3)+,d5
add.l d5,d2
move.l d0,(a4)+
asr.l #1,d2
move.w d1,(a4)+
move.l d2,(a4)+
move.l d3,(a4)+
move.l (a3)+,d0
add.l d0,d3
move.w d4,(a4)+
asr.l #1,d3
move.w (a3)+,d1
add.w d1,d4
move.l d5,(a4)+
asr.w #1,d4
move.l (a3)+,d2
add.l d2,d5
move.l d3,(a4)+
asr.l #1,d5
move.w d4,(a4)+
move.l d5,(a4)+
subq #1,d7
bgt.s middleloop
move.l d0,(a4)+
move.w d1,(a4)+
move.l d2,(a4)+
add.w a2,a2
dbra d6,iterloop
noiters:
CalcAndDraw:
; CACHE_ON d2
move.l a0,a1
move.w multcount,d7
.findfirstinfront:
move.l (a1)+,d1
move.w (a1)+,d0
bgt.s .foundinfront
move.l (a1)+,d4
dbra d7,.findfirstinfront
rts ; no two points were in front
.foundinfront:
move.w (a1)+,d4
move.w (a1)+,lbr
; d1=left x, d4=left end, d0=left dist
divs d0,d1
add.w MIDDLEX,d1
move.l topofwall(pc),d5
divs d0,d5
add.w MIDDLEY,d5
move.w d5,strtop
move.l botofwall(pc),d5
divs d0,d5
add.w MIDDLEY,d5
move.w d5,strbot
.computeloop:
move.w 4(a1),d2
bgt.s .infront
rts
.infront:
move.l #store,a0
move.l (a1),d3
divs d2,d3
move.w 6(a1),d5
add.w MIDDLEX,d3
move.w strtop(pc),12(a0)
move.l topofwall(pc),d6
divs d2,d6
move.w strbot(pc),16(a0)
add.w MIDDLEY,d6
move.w d6,strtop
move.w d6,14(a0)
move.l botofwall(pc),d6
divs d2,d6
add.w MIDDLEY,d6
move.w d6,strbot
move.w d6,18(a0)
move.w d3,2(a1)
cmp.w leftclip(pc),d3
blt .alloffleft
cmp.w rightclip(pc),d1
; cmp.w #95,d1
bge .alloffright
movem.l d0/d1/d2/d3/a0,-(a7)
moveq #0,d0
move.b WALLIDENT,d0
blt.s .noputinmap
move.b d0,d3
and.b #15,d0
move.l COMPACTPTR,a0
moveq #0,d1
move.w d0,d2
add.w d0,d0
add.w d2,d0
bset d0,d1
btst #4,d3
beq.s .nodoor
addq #2,d0
bset d0,d1
.nodoor:
or.l d1,(a0)
move.l BIGPTR,a0
move.w wallleftpt,(a0,d2.w*4)
move.w wallrightpt,2(a0,d2.w*4)
.noputinmap
movem.l (a7)+,d0/d1/d2/d3/a0
bra OTHERHALF
.alloffleft:
move.l (a1)+,d1
move.w (a1)+,d0
move.w (a1)+,d4
move.w (a1)+,lbr
dbra d7,.computeloop
rts
.alloffright:
rts
computeloop2:
move.w 4(a1),d2
bgt.s .infront
rts
.infront:
move.l #store,a0
move.l (a1),d3
divs d2,d3
move.w 6(a1),d5
add.w MIDDLEX,d3
move.w strtop(pc),12(a0)
move.l topofwall(pc),d6
divs d2,d6
move.w strbot(pc),16(a0)
add.w MIDDLEY,d6
move.w d6,strtop
move.w d6,14(a0)
move.l botofwall(pc),d6
divs d2,d6
add.w MIDDLEY,d6
move.w d6,strbot
move.w d6,18(a0)
move.w d3,2(a1)
cmp.w leftclip(pc),d3
blt.s alloffleft2
cmp.w rightclip(pc),d1
; cmp.w #95,d1
bge.s alloffright2
OTHERHALF:
move.w d1,(a0)
move.w d3,2(a0)
move.w d4,4(a0)
move.w d5,6(a0)
move.w d0,8(a0)
move.w d2,10(a0)
move.w lbr,d5
sub.w #300,d5
ext.w d5
move.w d5,24(a0)
move.w 8(a1),d5
sub.w #300,d5
ext.w d5
move.w d5,26(a0)
movem.l d7/a1,-(a7)
move.w #maxscrdiv,d7
bsr Doleftend
movem.l (a7)+,d7/a1
alloffleft2:
move.l (a1)+,d1
move.w (a1)+,d0
move.w (a1)+,d4
move.w (a1)+,lbr
dbra d7,computeloop2
rts
alloffright2:
rts
lbr: dc.w 0
tlbr: dc.w 0
leftwallbright: dc.w 0
rightwallbright: dc.w 0
leftwallTOPbright: dc.w 0
rightwallTOPbright: dc.w 0
strtop: dc.w 0
strbot: dc.w 0
databuffer:
ds.l 1600
databuffer2:
ds.l 1600
***********************************
* Need a routine which takes...?
* Top Y (3d)
* Bottom Y (3d)
* distance
* height of each tile (number and routine addr)
* And produces the appropriate strip on the
* screen.
topofwall: dc.l 0
botofwall: dc.l 0
nostripq:
rts
ScreenWallstripdraw:
move.w d4,d6
cmp.w topclip(pc),d6
blt.s nostripq
cmp.w botclip(pc),d3
bgt.s nostripq
cmp.w botclip(pc),d6
ble.s noclipbot
move.w botclip(pc),d6
noclipbot:
move.w d3,d5
cmp.w topclip(pc),d5
bge.s nocliptop
move.w topclip(pc),d5
btst #0,d5
beq.s .nsbd
exg a2,a4
.nsbd:
bra gotoend
nocliptop:
btst #0,d5
beq.s .nsbd
exg a2,a4
.nsbd:
bra gotoend
wlcnt: dc.w 0
CNOP 0,4
drawwalldimPACK0:
and.w d7,d4
move.b 1(a5,d4.w*2),d1
and.b #31,d1
add.l d3,d4
move.w (a4,d1.w*2),(a3)
adda.w d0,a3
addx.w d2,d4
dbra d6,drawwallPACK0
rts
CNOP 0,128
drawwallPACK0:
and.w d7,d4
move.b 1(a5,d4.w*2),d1
and.b #31,d1
add.l d3,d4
move.w (a2,d1.w*2),(a3)
adda.w d0,a3
addx.w d2,d4
dbra d6,drawwalldimPACK0
nostrip:
rts
CNOP 0,4
drawwalldimPACK1:
and.w d7,d4
move.w (a5,d4.w*2),d1
lsr.w #5,d1
and.w #31,d1
add.l d3,d4
move.w (a4,d1.w*2),(a3)
adda.w d0,a3
addx.w d2,d4
dbra d6,drawwallPACK1
rts
CNOP 0,4
drawwallPACK1:
and.w d7,d4
move.w (a5,d4.w*2),d1
lsr.w #5,d1
and.w #31,d1
add.l d3,d4
move.w (a2,d1.w*2),(a3)
adda.w d0,a3
addx.w d2,d4
dbra d6,drawwalldimPACK1
rts
CNOP 0,4
drawwalldimPACK2:
and.w d7,d4
move.b (a5,d4.w*2),d1
lsr.b #2,d1
add.l d3,d4
move.w (a4,d1.w*2),(a3)
adda.w d0,a3
addx.w d2,d4
dbra d6,drawwallPACK2
rts
CNOP 0,4
drawwallPACK2:
and.w d7,d4
move.b (a5,d4.w*2),d1
lsr.b #2,d1
add.l d3,d4
move.w (a2,d1.w*2),(a3)
adda.w d0,a3
addx.w d2,d4
dbra d6,drawwalldimPACK2
rts
usesimple:
mulu d3,d4
add.l d0,d4
swap d4
add.w totalyoff(pc),d4
cliptopusesimple
move.w VALAND,d7
move.w #104*4,d0
moveq #0,d1
cmp.l a4,a2
blt.s usea2
move.l a4,a2
usea2:
and.w d7,d4
move.l d2,d5
clr.w d5
cmp.b #1,StripData+1
dbge d6,simplewalliPACK0
dbne d6,simplewalliPACK1
dble d6,simplewalliPACK2
rts
CNOP 0,4
simplewalliPACK0:
move.b 1(a5,d4.w*2),d1
and.b #31,d1
move.b (a2,d1.w*2),d3
simplewallPACK0:
move.b d3,(a3)
adda.w d0,a3
add.l d2,d4
bcc.s .noread
addq #1,d4
and.w d7,d4
move.b 1(a5,d4.w*2),d1
and.b #31,d1
move.b (a2,d1.w*2),d3
.noread:
dbra d6,simplewallPACK0
rts
CNOP 0,4
simplewalliPACK1:
move.w (a5,d4.w*2),d1
lsr.w #5,d1
and.w #31,d1
move.b (a2,d1.w*2),d3
simplewallPACK1:
move.b d3,(a3)
adda.w d0,a3
add.l d5,d4
bcc.s .noread
addq #1,d4
and.w d7,d4
move.w (a5,d4.w*2),d1
lsr.w #5,d1
and.w #31,d1
move.b (a2,d1.w*2),d3
.noread:
dbra d6,simplewallPACK1
rts
CNOP 0,4
simplewalliPACK2:
move.b (a5,d4.w*2),d1
lsr.b #2,d1
and.b #31,d1
move.b (a2,d1.w*2),d3
simplewallPACK2:
move.b d3,(a3)
adda.w d0,a3
add.l d5,d4
bcc.s .noread
addq #1,d4
and.w d7,d4
move.b (a5,d4.w*2),d1
lsr.b #2,d1
move.b (a2,d1.w*2),d3
.noread:
dbra d6,simplewallPACK2
rts
;gotoendnomult:
; movem.l d0/d1/d2/d3/d4/d7,-(a7)
; add.l timeslarge(pc,d5.w*4),a3
; move.w d5,d4
; move.l 4(a1,d2.w*8),d0
; move.l (a1,d2.w*8),d2
; moveq #0,d3
; move.w d2,d3
; swap d2
; tst.w d2
; move.w wallyoff(pc),d4
; add.w #44,d4
; bne.s .notsimple
; cmp.l #$b000,d3
; ble cliptopusesimple
;.notsimple:
; bra cliptop
MIDDLEY: dc.w 120
BIGMIDDLEY: dc.l 320*120
TOPOFFSET: dc.w 0
SMIDDLEY: dc.w 120
SBIGMIDDLEY: dc.l 320*120
STOPOFFSET: dc.w 0
gotoend:
tst.b DOUBLEHEIGHT
bne doubwall
sub.w d5,d6 ; height to draw.
ble nostripq
add.l timeslarge(pc,d5.w*4),a3
add.w d2,d2
move.l 4(a1,d2.w*8),d0
add.w TOPOFFSET(pc),d5
move.w d5,d4
move.l (a1,d2.w*4),d2
; moveq #0,d3
; move.w d2,d3
; swap d2
; tst.w d2
; bne.s .notsimple
; cmp.l #$b000,d3
; ble usesimple
;.notsimple:
ext.l d5
move.l d2,d4
muls.l d5,d4
add.l d0,d4
ifne CHEESEY
asr.l #1,d4
endc
swap d4
; mulu d3,d4
; muls d2,d5
; add.l d0,d4
; swap d4
; add.w d5,d4
add.w totalyoff(pc),d4
move.w VALAND,d7
and.w d7,d4
move.w #104*4,d0
moveq #0,d1
ifne CHEESEY
asr.l #1,d2
endc
swap d2
move.l d2,d3
clr.w d3
cmp.b #1,StripData+1
dbge d6,drawwallPACK0
dbne d6,drawwallPACK1
dble d6,drawwallPACK2
rts
timeslarge:
val SET 0
REPT 256
dc.l val
val SET val+104*4
ENDR
doubwall
moveq #0,d0
asr.w #1,d5
; addx.w d0,d5
; add.w d5,d5
asr.w #1,d6
sub.w d5,d6
ble nostripq
add.l timeslargeDOUB(pc,d5.w*4),a3
add.w d5,d5
add.w d2,d2
move.l 4(a1,d2.w*8),d0
add.w TOPOFFSET(pc),d5
move.w d5,d4
move.l (a1,d2.w*4),d2
; moveq #0,d3
; move.w d2,d3
; swap d2
; tst.w d2
; bne.s .notsimple
; cmp.l #$b000,d3
; ble usesimple
;.notsimple:
ext.l d5
move.l d2,d4
muls.l d5,d4
add.l d0,d4
ifne CHEESEY
asr.l #1,d4
endc
swap d4
; mulu d3,d4
; muls d2,d5
; add.l d0,d4
; swap d4
; add.w d5,d4
add.w totalyoff(pc),d4
move.w VALAND,d7
and.w d7,d4
move.w #104*4,d0
moveq #0,d1
ifeq CHEESEY
add.l d2,d2
endc
swap d2
move.l d2,d3
clr.w d3
cmp.b #1,StripData+1
dbge d6,drawwallPACK0
dbne d6,drawwallPACK1
dble d6,drawwallPACK2
rts
timeslargeDOUB:
val SET 0
REPT 256
dc.l val
val SET val+104*4
ENDR
ScreenWallstripdrawBIG:
move.w d4,d6
cmp.w topclip(pc),d6
blt nostripq
cmp.w botclip(pc),d3
bgt nostripq
cmp.w botclip(pc),d6
ble.s .noclipbot
move.w botclip(pc),d6
.noclipbot:
move.w d3,d5
cmp.w topclip(pc),d5
bge.s .nocliptop
move.w topclip(pc),d5
btst #0,d5
beq.s .nsbd
exg a2,a4
.nsbd:
bra gotoendBIG
.nocliptop:
btst #0,d5
beq.s .nsbd2
exg a2,a4
.nsbd2:
gotoendBIG
tst.b DOUBLEHEIGHT
bne doubwallBIG
sub.w d5,d6 ; height to draw.
ble nostripq
add.l timeslargeBIG(pc,d5.w*4),a3
move.w d2,d4
add.w d2,d2
add.w d2,d4
move.l 4(a1,d4.w*8),d0
add.w TOPOFFSET(pc),d5
move.w d5,d4
move.l (a1,d2.w*4),d2
; moveq #0,d3
; move.w d2,d3
; swap d2
; tst.w d2
; bne.s .notsimple
; cmp.l #$b000,d3
; ble usesimple
;.notsimple:
ext.l d5
move.l d2,d4
muls.l d5,d4
add.l d0,d4
ifne CHEESEY
asr.l #1,d4
endc
swap d4
; mulu d3,d4
; muls d2,d5
; add.l d0,d4
; swap d4
; add.w d5,d4
add.w totalyoff(pc),d4
move.w VALAND,d7
and.w d7,d4
move.w #320,d0
moveq #0,d1
ifne CHEESEY
asr.l #1,d2
endc
swap d2
move.l d2,d3
clr.w d3
cmp.b #1,StripData+1
dbge d6,drawwallPACK0
dbne d6,drawwallPACK1
dble d6,drawwallPACK2
rts
timeslargeBIG:
val SET 0
REPT 256
dc.l val
val SET val+320
ENDR
doubwallBIG:
moveq #0,d0
asr.w #1,d5
addx.w d0,d5
add.w d5,d5
sub.w d5,d6 ; height to draw.
asr.w #1,d6
ble nostripq
add.l timeslargeBIGDOUB(pc,d5.w*4),a3
move.w d2,d4
add.w d2,d2
add.w d2,d4
move.l 4(a1,d4.w*8),d0
add.w TOPOFFSET(pc),d5
move.w d5,d4
move.l (a1,d2.w*4),d2
; moveq #0,d3
; move.w d2,d3
; swap d2
; tst.w d2
; bne.s .notsimple
; cmp.l #$b000,d3
; ble usesimple
;.notsimple:
ext.l d5
move.l d2,d4
muls.l d5,d4
add.l d0,d4
ifne CHEESEY
asr.l #1,d4
endc
swap d4
; mulu d3,d4
; muls d2,d5
; add.l d0,d4
; swap d4
; add.w d5,d4
add.w totalyoff(pc),d4
move.w VALAND,d7
and.w d7,d4
move.w #640,d0
moveq #0,d1
ifeq CHEESEY
add.l d2,d2
endc
swap d2
move.l d2,d3
clr.w d3
cmp.b #1,StripData+1
dbge d6,drawwallPACK0
dbne d6,drawwallPACK1
dble d6,drawwallPACK2
rts
timeslargeBIGDOUB:
val SET 0
REPT 256
dc.l val
val SET val+320
ENDR
nostripqthru:
rts
ScreenWallstripdrawthru:
move.w d4,d6
cmp.w topclip(pc),d6
blt.s nostripqthru
cmp.w botclip(pc),d3
bgt.s nostripqthru
cmp.w botclip(pc),d6
ble.s .noclipbot
move.w botclip(pc),d6
.noclipbot:
move.w d3,d5
cmp.w topclip(pc),d5
bge.s .nocliptop
move.w topclip(pc),d5
btst #0,d5
beq.s .nsbd
exg a2,a4
.nsbd:
sub.w d5,d6 ; height to draw.
ble.s nostripqthru
bra gotoendthru
.nocliptop:
btst #0,d5
beq.s .nsbdthru
exg a2,a4
.nsbdthru:
sub.w d5,d6 ; height to draw.
ble.s nostripqthru
bra gotoendthru
CNOP 0,4
drawwalldimthruPACK0:
and.w d7,d4
move.b 1(a5,d4.w*2),d1
and.b #31,d1
beq.s .holey
move.w (a4,d1.w*2),(a3)
.holey:
adda.w d0,a3
add.l d3,d4
addx.w d2,d4
dbra d6,drawwallthruPACK0
rts
CNOP 0,4
drawwallthruPACK0:
and.w d7,d4
move.b 1(a5,d4.w*2),d1
and.b #31,d1
beq.s .holey
move.w (a2,d1.w*2),(a3)
.holey:
adda.w d0,a3
add.l d3,d4
addx.w d2,d4
dbra d6,drawwalldimthruPACK0
nostripthru:
rts
CNOP 0,4
drawwalldimthruPACK1:
and.w d7,d4
move.w (a5,d4.w*2),d1
lsr.w #5,d1
and.w #31,d1
beq.s .holey
move.w (a4,d1.w*2),(a3)
.holey:
adda.w d0,a3
add.l d3,d4
addx.w d2,d4
dbra d6,drawwallthruPACK1
rts
CNOP 0,4
drawwallthruPACK1:
and.w d7,d4
move.w (a5,d4.w*2),d1
lsr.w #5,d1
and.w #31,d1
beq.s .holey
move.w (a2,d1.w*2),(a3)
.holey:
adda.w d0,a3
add.l d3,d4
addx.w d2,d4
dbra d6,drawwalldimthruPACK1
rts
CNOP 0,4
drawwalldimthruPACK2:
and.w d7,d4
move.b (a5,d4.w*2),d1
lsr.b #2,d1
and.b #31,d1
beq.s .holey
move.w (a4,d1.w*2),(a3)
.holey:
adda.w d0,a3
add.l d3,d4
addx.w d2,d4
dbra d6,drawwallthruPACK2
rts
CNOP 0,4
drawwallthruPACK2:
and.w d7,d4
move.b (a5,d4.w*2),d1
lsr.b #2,d1
and.b #31,d1
beq.s .holey
move.w (a2,d1.w*2),(a3)
.holey:
adda.w d0,a3
add.l d3,d4
addx.w d2,d4
dbra d6,drawwalldimthruPACK2
rts
usesimplethru:
mulu d3,d4
add.l d0,d4
swap d4
add.w totalyoff(pc),d4
cliptopusesimplethru
moveq #63,d7
move.w #104*4,d0
moveq #0,d1
cmp.l a4,a2
blt.s usea2thru
move.l a4,a2
usea2thru:
and.w d7,d4
move.l d2,d5
clr.w d5
cmp.b #1,StripData+1
dbge d6,simplewallthruiPACK0
dbne d6,simplewallthruiPACK1
dble d6,simplewallthruiPACK2
rts
CNOP 0,4
simplewallthruiPACK0:
move.b 1(a5,d4.w*2),d1
and.b #31,d1
move.w (a2,d1.w*2),d3
simplewallthruPACK0:
move.w d3,(a3)
adda.w d0,a3
add.l d5,d4
bcc.s noreadthruPACK0
maybeholePACK0
addx.w d2,d4
and.w d7,d4
move.b 1(a5,d4.w*2),d1
and.b #31,d1
beq.s holeysimplePACK0
move.w (a2,d1.w*2),d3
dbra d6,simplewallthruPACK0
rts
noreadthruPACK0:
addx.w d2,d4
dbra d6,simplewallthruPACK0
rts
CNOP 0,4
simplewallholePACK0:
adda.w d0,a3
add.l d5,d4
bcs.s maybeholePACK0
addx.w d2,d4
holeysimplePACK0
and.w d7,d4
dbra d6,simplewallholePACK0
rts
CNOP 0,4
simplewallthruiPACK1:
move.w (a5,d4.w*2),d1
lsr.w #5,d1
and.w #31,d1
move.w (a2,d1.w*2),d3
simplewallthruPACK1:
move.w d3,(a3)
adda.w d0,a3
add.l d5,d4
bcc.s noreadthruPACK1
maybeholePACK1
addx.w d2,d4
and.w d7,d4
move.w (a5,d4.w*2),d1
lsr.w #5,d1
and.w #31,d1
beq.s holeysimplePACK1
move.w (a2,d1.w*2),d3
dbra d6,simplewallthruPACK1
rts
noreadthruPACK1:
addx.w d2,d4
dbra d6,simplewallthruPACK1
rts
CNOP 0,4
simplewallholePACK1:
adda.w d0,a3
add.l d5,d4
bcs.s maybeholePACK1
addx.w d5,d4
holeysimplePACK1
and.w d7,d4
dbra d6,simplewallholePACK1
rts
CNOP 0,4
simplewallthruiPACK2:
move.b (a5,d4.w*2),d1
lsr.b #2,d1
and.b #31,d1
move.w (a2,d1.w*2),d3
simplewallthruPACK2:
move.w d3,(a3)
adda.w d0,a3
add.l d5,d4
bcc.s noreadthruPACK2
maybeholePACK2
addx.w d2,d4
and.w d7,d4
move.b (a5,d4.w*2),d1
lsr.b #2,d1
and.b #31,d1
beq.s holeysimplePACK2
move.w (a2,d1.w*2),d3
dbra d6,simplewallthruPACK2
rts
noreadthruPACK2:
addx.w d2,d4
dbra d6,simplewallthruPACK2
rts
CNOP 0,4
simplewallholePACK2
adda.w d0,a3
add.l d5,d4
bcs.s maybeholePACK2
addx.w d2,d4
holeysimplePACK2
and.w d7,d4
dbra d6,simplewallholePACK2
rts
gotoendthru:
add.l timeslargethru(pc,d5.w*4),a3
move.w d5,d4
move.l 4(a1,d2.w*8),d0
move.l (a1,d2.w*8),d2
moveq #0,d3
move.w d2,d3
swap d2
tst.w d2
bne.s .notsimple
cmp.l #$b000,d3
ble usesimplethru
.notsimple:
mulu d3,d4
muls d2,d5
add.l d0,d4
swap d4
add.w d5,d4
add.w wallyoff(pc),d4
cliptopthru
moveq #63,d7
move.w #104*4,d0
moveq #0,d1
move.l d2,d3
clr.w d3
cmp.b #1,StripData+1
dbge d6,drawwallthruPACK0
dbne d6,drawwallthruPACK1
dble d6,drawwallthruPACK2
rts
timeslargethru:
val SET 104*4
REPT 80
dc.l val
val SET val+104*4
ENDR
totalyoff: dc.w 0
wallyoff: dc.w 0
******************************************
* Wall polygon
leftend: dc.w 0
wallbrightoff: dc.w 0
wallleftpt: dc.w 0
wallrightpt: dc.w 0
WHICHPBR: dc.w 0
WHICHLEFTPT: dc.w 0
WHICHRIGHTPT: dc.w 0
OTHERZONE: dc.w 0
itsawalldraw:
move.l #Rotated,a5
move.l #OnScreen,a6
move.w (a0)+,d0
move.w (a0)+,d2
move.w d0,wallleftpt
move.w d2,wallrightpt
move.b (a0)+,WHICHLEFTPT+1
move.b (a0)+,WHICHRIGHTPT+1
move.w #0,leftend
moveq #0,d5
move.w (a0)+,d5
ifne CHEESEY
asr.w #1,d5
endc
move.w (a0)+,d1
ifeq CHEESEY
asl.w #4,d1
endc
ifne CHEESEY
asl.w #3,d1
endc
move.w d1,fromtile
move.w (a0)+,d1
move.w d1,totalyoff
move.w (a0)+,d1
move.l #walltiles,a3
move.l (a3,d1.w*4),a3
move.l a3,PaletteAddr
add.l #64*32,a3
move.l a3,ChunkAddr
;move.w (a0)+,d1
;add.w ZoneBright,d1
move.w ZoneBright,angbright
;move.w (a0)+,d1
;move.w (a0)+,d4
move.l yoff,d6
moveq #0,d1
move.b (a0)+,d1
ifne CHEESEY
asr.w #1,d1
endc
move.w d1,VALAND
moveq #0,d1
move.b (a0)+,d1
ifne CHEESEY
sub.w #1,d1
endc
move.w d1,VALSHIFT
moveq #0,d1
move.b (a0)+,d1
ifne CHEESEY
asr.w #1,d1
endc
move.w d1,HORAND
move.b (a0)+,WHICHPBR
move.w totalyoff,d1
add.w wallyoff,d1
ifne CHEESEY
asr.w #1,d1
endc
and.w VALAND,d1
move.w d1,totalyoff
move.l (a0)+,topofwall
sub.l d6,topofwall
move.l (a0)+,botofwall
sub.l d6,botofwall
move.b (a0)+,d3
ext.w d3
move.w d3,wallbrightoff
move.b (a0)+,OTHERZONE+1
move.l topofwall,d3
cmp.l botofwall,d3
bge wallfacingaway
tst.w 6(a5,d0*8)
bgt.s cantell
tst.w 6(a5,d2*8)
ble wallfacingaway
bra cliptotestfirstbehind
cantell:
tst.w 6(a5,d2*8)
ble.s cliptotestsecbehind
bra pastclip
cliptotestfirstbehind:
move.l (a5,d0*8),d3
sub.l (a5,d2*8),d3
move.w 6(a5,d0*8),d6
sub.w 6(a5,d2*8),d6
divs d6,d3
muls 6(a5,d2*8),d3
neg.l d3
add.l (a5,d2*8),d3
move.w (a6,d2*2),d6
sub.w MIDDLEX,d6
ext.l d6
cmp.l d6,d3
bge wallfacingaway
bra cant_tell
bra pastclip
cliptotestsecbehind:
move.l (a5,d2*8),d3
sub.l (a5,d0*8),d3
move.w 6(a5,d2*8),d6
sub.w 6(a5,d0*8),d6
divs d6,d3
muls 6(a5,d0*8),d3
neg.l d3
add.l (a5,d0*8),d3
move.w (a6,d0*2),d6
sub.w MIDDLEX,d6
ext.l d6
cmp.l d6,d3
ble wallfacingaway
bra cant_tell
pastclip:
move.w (a6,d0*2),d3
cmp.w RIGHTX,d3
bge wallfacingaway
cmp.w (a6,d2*2),d3
bge wallfacingaway
tst.w (a6,d2*2)
blt wallfacingaway
cant_tell:
; move.l a1,a4
; move.w #31,d6
; move.l #0,d3
;.emptylop:
; move.l d3,(a4)+
; dbra d6,.emptylop
; move.w rightclip(pc),d6
; st (a1,d6)
; move.w leftclip(pc),d6
; st -1(a1,d6)
; muls sinval(pc),d1
; muls cosval(pc),d4
; add.l d1,d4
; add.l d4,d4
; swap d4
; neg.w d4
; move.w d4,d6
; asr.w #1,d4
; sub.w d4,angbright
; and.b #$fe,d4
; asl.w #2,d4
; asl.w #2,d6
movem.l d7/a0/a5/a6,-(a7)
move.l (a5,d0*8),a0
; add.l a0,a0
move.w 6(a5,d0*8),d1
move.l (a5,d2*8),a2
; add.l a2,a2
move.w 6(a5,d2*8),d3
move.l #CurrentPointBrights,a5
tst.b DOUPPER
beq.s .notupper
add.w #4,a5
.notupper
move.w currzone,d0
move.b WHICHPBR,d4
btst #3,d4
beq.s .nototherzone
move.w OTHERZONE,d0
.nototherzone
and.w #7,d4
muls #40,d0
add.w d0,d4
move.w WHICHLEFTPT,d0
asl.w #2,d0
add.w d4,d0
move.w (a5,d0.w*2),d0
bge.s .okpos1
neg.w d0
.okpos1:
add.w wallbrightoff,d0
move.w d0,leftwallbright
move.w WHICHRIGHTPT,d0
asl.w #2,d0
add.w d4,d0
move.w (a5,d0.w*2),d0
bge.s .okpos2
neg.w d0
.okpos2:
add.w wallbrightoff,d0
move.w d0,rightwallbright
move.w currzone,d0
move.b WHICHPBR,d4
lsr.w #4,d4
btst #3,d4
beq.s .nototherzone2
move.w OTHERZONE,d0
.nototherzone2
and.w #7,d4
muls #40,d0
add.w d0,d4
move.w WHICHLEFTPT,d0
asl.w #2,d0
add.w d4,d0
move.w (a5,d0.w*2),d0
bge.s .okpos3
neg.w d0
.okpos3:
add.w wallbrightoff,d0
move.w d0,leftwallTOPbright
move.w WHICHRIGHTPT,d0
asl.w #2,d0
add.w d4,d0
move.w (a5,d0.w*2),d0
bge.s .okpos4
neg.w d0
.okpos4:
add.w wallbrightoff,d0
move.w d0,rightwallTOPbright
move.w leftend(pc),d4
move.l #max3ddiv,d7
ifeq CHEESEY
move.w rightwallTOPbright,d0
cmp.w rightwallbright,d0
bne.s gottagour
move.w leftwallTOPbright,d0
cmp.w leftwallbright,d0
bne.s gottagour
endc
bsr walldraw
bra.s nottagour
gottagour:
bsr walldrawGOUR
nottagour:
movem.l (a7)+,d7/a0/a5/a6
wallfacingaway:
rts
PointBrightsPtr: dc.l 0
midpt: dc.l 0
dist1: dc.l 0
dist2: dc.l 0
VALAND: dc.w 0
VALSHIFT: dc.w 0
HORAND: dc.w 0
sinval: dc.w 0
cosval: dc.w 0
oldxoff: dc.w 0
oldzoff: dc.w 0
topclip: dc.w 0
botclip: dc.w 0
seethru: dc.w 0